10.2B: Menelusuri Database SQLite
Daftar Isi:
- Yang harus sudah Anda KETAHUI
- Yang akan Anda PELAJARI
- Yang akan Anda LAKUKAN
- Ringkasan Aplikasi
- Tugas 0. Mengunduh dan menjalankan kode dasar
- Tugas 1. Menambahkan Item Menu Penelusuran
- Tantangan penyusunan kode
- Rangkuman
- Konsep terkait
Yang harus sudah Anda KETAHUI
Untuk praktik ini, Anda harus sudah mengenal:
Yang akan Anda PELAJARI
Anda akan belajar:
- Menambahkan fungsionalitas penelusuran ke aplikasi Anda melalui menu opsi
- Membangun kueri penelusuran untuk database SQLite dari input pengguna.
Yang akan Anda LAKUKAN
Dalam praktik ini Anda akan menambahkan item ke opsi menu untuk menelusuri database, dan sebuah aktivitas yang memungkinkan pengguna memasukkan string penelusuran dan menampilkan hasil penelusuran di sebuah tampilan teks.
Mengapa: Pengguna harus selalu bisa menelusuri data dengan istilahnya sendiri.
Catatan: Fokus praktik ini bukan pada pengoptimalan UX permintaan penelusuran, tetapi menampilkan cara melakukan kueri database.
Ringkasan Aplikasi
Anda akan membuat salinan aplikasi WordListSQLInteractive (atau WordListSqlStarterCode jika Anda belum mengubah namanya, dari praktik sebelumnya) yang sudah selesai, berikan nama WordListSQLInteractiveWithSearch, dan tambahkan aktivitas yang memungkinkan pengguna menelusuri kata sebagian dan penuh di database. Misalnya, memasukkan "Android" akan mengembalikan semua entri yang berisi substring "Android".
Tugas 0. Mengunduh dan menjalankan kode dasar
Untuk menghemat pekerjaan, praktik ini akan meneruskan aplikasi yang telah Anda bangun. Dalam lingkungan produksi, meneruskan kode aplikasi yang sudah ada adalah tugas umum developer untuk menambahkan fitur atau memperbaiki masalah.
1. Buat proyek Anda
Unduh aplikasi WordListSQL yang sudah selesai.
Anda bisa menggunakan aplikasi Anda sendiri atau mengunduh aplikasi dasar. Selama aplikasi menggunakan database SQLite, Anda bisa menggunakan petunjuk ini untuk memperluasnya.
- Muat salinan aplikasi ke dalam Android Studio. Baca Apendiks untuk informasi tentang menyalin proyek.
- Ubah nama paket menggunakan Refactor > Rename.
- Ubah nama paket di file build.gradle Anda.
- Jalankan aplikasi untuk memastikan aplikasi dibangun dan berfungsi dengan benar.
Tugas 1. Tambahkan Penelusuran
1.1 Tambahkan Menu Opsi dengan item Penelusuran
Gunakan kode OptionsMenuSample dari praktik sebelumnya jika Anda memerlukan contoh cara melakukannya.
- Di proyek Anda, buat direktori Android Resource dan tetapkan sebagai menu dengan "menu" sebagai tipe sumber daya (res > menu).
- Tambahkan sumber daya menu main_menu.xml ke res > menu.
Buat menu dengan satu item Search. Rujuk cuplikan kode untuk melihat nilaiya.
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app = "http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context="com.android.example.wordlistsqlsearchable.MainActivity"> <item android:id="@+id/action_search" android:title="Search..." android:orderInCategory="1" app:showAsAction="never" /> </menu>
- Di MainActivity, mekarkan menu dengan mengganti onCreateOptionsMenu.
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); return true; }
- Ganti metode onOptionsItemSelected. Aktifkan action_search dan hanya kembalikan true.
@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_search: return true; } return super.onOptionsItemSelected(item); }
- Jalankan aplikasi Anda. Anda akan melihat titik-titik untuk menu opsi. Saat mengekliknya, Anda akan melihat satu item menu untuk penelusuran yang tidak melakukan apa pun.
1.2 Buat layout untuk aktivitas penelusuran
Layout ini mirip dengan activity_edit_word, sehingga Anda bisa memanfaatkan kode yang sudah ada dan menyalinnya.
- Buat salinan activity_edit_word dan beri nama activity_search.xml.
- Di activity_search.xml, ubah id dan string agar menjadi representasi penelusuran.
- Ubah metode onClick untuk tombol untuk menampilkan hasil.
- Tambahkan TextView dengan di search_result, minimal dengan tinggi 300dp dan ukuran font 18sp.
- Jalankan aplikasi Anda. Anda tidak akan melihat perubahan.
1.3 Tambahkan Aktivitas untuk penelusuran
- Tambahkan aktivitas baru, SearchActivity. Jika Anda membuatnya dari New > Android > Activity, JANGAN buat file layout karena kita sudah membuatnya di tugas sebelumnya.
- Tambahkan variabel kelas TextView pribadi mTextView.
- Tambahkan variabel kelas EditText pribadi mEditWordView.
- Tambahkan variabel WordListOpenHelper mDB.
- Di onCreate, inisialisasikan mDB dengan WordListOpenHelper(this) baru.
Di onCreate, inisialisasikan mTextView dan mEditWordView ke tampilan perspektifnya.
public class SearchActivity extends AppCompatActivity { private static final String TAG = EditWordActivity.class.getSimpleName(); private TextView mTextView; private EditText mEditWordView; private WordListOpenHelper mDB; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_search); mEditWordView = ((EditText) findViewById(R.id.search_word)); mTextView = ((TextView) findViewById(R.id.search_result)); mDB = new WordListOpenHelper(this); } }
- Tambahkan aktivitas ke AndroidManifest.
<activity android:name="com.android.example.wordlistsqlsearchable.SearchActivity"> </activity>
1.4 Picu SearchActivity dari menu
- Untuk memulai SearchActivity saat item menu dipilih, sisipkan kode untuk memulai SearchActivity ke dalam pernyataan Switch di metode onOptionSelected() di MainActivity.
Intent intent = new Intent(getBaseContext(), SearchActivity.class); startActivity(intent);
- Bangun dan jalankan aplikasi Anda untuk memastikan SearchActivity diluncurkan saat item menu "Search" dipilih dari OptionsMenu.
- Masukkan string penelusuran dan tekan "Search". Aplikasi Anda crash.
- Cari tahu mengapa aplikasi Anda crash, lalu pindah ke tugas berikutnya.
1.5 Implementasikan handler onClick untuk tombol Search di SearchActivity
Aplikasi Anda crash karena handler onClick yang disetel untuk tombol Search di kode XML belum ada. Jadi Anda akan membangun showResult selanjutnya.
Saat tombol Search ditekan, beberapa hal harus terjadi:
- Handle kejadian memanggil showResult(View view) void publik di SearchActivity.
- Aplikasi Anda harus mendapatkan nilai saat ini dari mEditWordView, yaitu string penelusuran Anda.
- Cetak "Result for" dan kata di mTextView.
- Panggil fungsi penelusuran (belum ditulis) di mDB (mDB.search(word)) dan dapatkan kembali kursor database SQLite. Anda akan mengimplementasikan fungsi penelusuran di tugas berikutnya.
- Proses kursor dan tambahkan hasilnya ke mTextView.
- Di SearchActivity, buat fungsi showResult. Fungsi ini bersifat publik, mengambil argumen View dan tidak mengembalikan apa pun.
- Buat variabel
String
yang bernamaword
dan inisialisasi dengan konten tampilkan edit masukan,mEditWordView
. - Tampilkan istilah penelusuran di TextView hasil penelusuran; sesuatu seperti
"Search term: " + word
- Telusuri database dan dapatkan kursor.
Cursor cursor = mDB.search(word);
Untuk memproses kursor, Anda perlu melakukan yang berikut:
Pastikan kursor tidak null.
Pindahkan kursor ke entri pertama.
Iterasikan entri saat ini pada pemrosesan kursor, lalu memindahkan kursor.
Ekstrak kata.
Tampilkan kata di tampilan teks.
- Tutup kursor.
- Jika tidak ada hasil yang ditemukan, pengguna akan melihat layar kosong tanpa hasil. Anda menginginkan ini agar ditangani di aplikasi produksi.
Periksa kode beranotasi untuk detail tambahan.
public void showResult(View view){ String word = mEditWordView.getText().toString(); mTextView.setText("Result for " + word + ":\n\n"); // Search for the word in the database. Cursor cursor = mDB.search(word); // Only process a non-null cursor with rows. if (cursor != null & cursor.getCount() > 0) { // You must move the cursor to the first item. cursor.moveToFirst(); int index; String result; // Iterate over the cursor, while there are entries. do { // Don't guess at the column index. // Get the index for the named column. index = cursor.getColumnIndex(WordListOpenHelper.KEY_WORD); // Get the value from the column for the current cursor. result = cursor.getString(index); // Add result to what's already in the text view. mTextView.append(result + "\n"); } while (cursor.moveToNext()); // Returns true or false cursor.close(); } // You should add some handling of null case. Right now, nothing happens. }
Aplikasi Anda tidak akan berjalan tanpa setidaknya satu implementasi stub untuk search(). Android Studio akan membuat stub untuk Anda. Di bola lampu, pilih metode create.
- Buka WordListOpenHelper.
- Implementasikan stub untuk penelusuran, dengan sebuah parameter String, yang mengembalikan kursor null.
- Jalankan aplikasi Anda dan perbaiki kesalahan apa pun yang mungkin Anda jumpai. Perhatikan bahwa sebagian besar kode di showResult() belum dijalankan.
1.6 Implementasikan metode penelusuran di WordListOpenHelper
Langkah terakhir adalah mengimplementasikan penelusuran database yang sebenarnya.
Di dalam metode search(), Anda perlu membangun kueri dengan string pencarian dan mengirimkan kueri ke database.
Cara yang lebih aman untuk melakukan ini adalah dengan menggunakan parameter untuk setiap bagian kueri.
MENGAPA: Di praktik sebelumnya, untuk kueri di WordListOpenHelper, Anda bisa membangun string kueri secara langsung dan mengirimkannya sebagai rawQuery(), karena Anda memiliki kontrol penuh pada konten kueri. Segera setelah Anda menangani masukan pengguna, Anda harus mengasumsikan bahwa masukan bisa jadi berbahaya.
Anda akan mempelajari selengkapnya tentang keamanan di bab Keamanan dan Tips Keamanan.
Kueri SQL untuk menelusuri semua entri di wordlist yang cocok dengan substring akan berbentuk seperti ini:
SELECT * FROM WORD_LIST_TABLE WHERE KEY_WORD LIKE %searchString%;
Formulir metode query yang diparameterisasi yang akan Anda panggil tampak seperti ini:
Cursor query (String table, // The table to query
String[] columns, // The columns to return
String selection, // WHERE statement
String[] selectionArgs, // Arguments to WHERE
String groupBy, // Grouping filter. Not used.
String having, // Additional condition filter. Not used.
String orderBy) // Ordering. Setting to null uses default.
Lihat Android Database SQLite dan dokumentasi untuk berbagai metode query().
Untuk kueri di metode search(), Anda perlu menetapkan hanya empat argumen pertama saja.
- Tabel telah didefinisikan sebagai konstanta
WORD_LIST_TABLE
. - Di search(), buat variabel untuk kolom. Anda hanya memerlukan nilai dari kolom
KEY_WORD
.String[] columns = new String[]{KEY_WORD};
- Tambahkan % ke parameter searchString.
searchString = "%" + searchString + "%";
- Buat klausa where. Abaikan "WHERE" karena ini tersirat. Gunakan tanda tanyan untuk argumen ke LIKE. Pastikan spasi benar.
String where = KEY_WORD + " LIKE ?";
- Tentukan argumen ke klausa where, yang merupakan searchString.
String[] whereArgs = new String[]{searchString};
- Tambahkan variabel kursor Cursor dan inisialisasi ke null.
Di blok try/catch.
Dapatkan database yang bisa dibaca jika mReadable belum disetel.
Lakukan query database menggunakan bentuk kueri di atas. Teruskan null untuk parameter yang tidak dipakai.
Tangani pengecualian. Anda bisa cukup mencatatnya di log.
- Kembalikan kursor.
- Jalankan aplikasi Anda dan telusuri string.
Berikut ini solusi untuk metode yang lengkap:
public Cursor search (String searchString) {
String[] columns = new String[]{KEY_WORD};
searchString = "%" + searchString + "%";
String where = KEY_WORD + " LIKE ?";
String[]whereArgs = new String[]{searchString};
Cursor cursor = null;
try {
if (mReadableDB == null) {mReadableDB = getReadableDatabase();}
cursor = mReadableDB.query(WORD_LIST_TABLE, columns, where, whereArgs, null, null, null);
} catch (Exception e) {
Log.d(TAG, "SEARCH EXCEPTION! " + e);
}
return cursor;
}
Kode solusi
Proyek Android Studio: WordListSqlSearchable
Tantangan penyusunan kode
- Tangani kasus di mana hasil tidak ditemukan dengan cara yang lebih ramah pengguna.
Kebanyakan contoh kode menggunakan AppBar default yang disertakan dengan Template Empty. Di beberapa bab sebelumnya, Anda telah mempelajari tentang Toolbar, misalnya, saat menggunakan Template Basic.
Ubah aplikasi untuk menggunakan Toolbar dan SearchView dan tampilkan ikon penelusuran pada toolbar.
https://developer.android.com/training/search/setup.html
https://developer.android.com/training/appbar/setting-up.html
- Seperti yang ditulis, aplikasi ini tidak terlalu aman. Pertimbangkan cara menambahkan validasi masukan dasar untuk string penelusuran. Lihat Tips Keamanan.
Rangkuman
- Menu opsi bisa menjadi UI yang efektif untuk menelusuri database SQLite
- Aktivitas terpisah untuk menangani UX untuk penelusuran bisa membantu berfokus pada pengguna.
- Di aplikasi produksi, kueri SQLite harus dikelola dengan hati-hati untuk menghindari kerusakan data dan masalah keamanan
- Kueri penelusuran SQLite bisa dibuat secara dinamis menggunakan masukan pengguna untuk parameter kueri.
- Metode query() menelusuri database untuk kata yang cocok.
- Metode query() mengembalikan kursor database yang bisa melintasi rangkaian hasil secara efisien.
- Kursor bisa digunakan untuk menampilkan hasil kepada pengguna.
Konsep terkait
Dokumentasi konsep terkait ada di Dasar-Dasar Developer Android: Konsep.
Ketahui selengkapnya
Dokumentasi Developer: